-
Notifications
You must be signed in to change notification settings - Fork 10.5k
add new methods to the NodePrinter to enable range tracking possibilities when demangling a name #82336
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Please note that this PR should be merged after: Only the changes in e9219cf are relevant to this PR. |
a98b2e6
to
e9219cf
Compare
@swift-ci please test |
@swift-ci please test windows |
@swift-ci please test macOS |
@swift-ci please test Windows |
…ties when demangling a name
e9219cf
to
479e664
Compare
@swift-ci please test |
/// | ||
/// \returns The demangled string. | ||
void demangleSymbolAsString(llvm::StringRef MangledName, | ||
NodePrinter *printer); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why does this take a NodePrinter *
instead of a NodePrinter &
? Is there any meaningful use for passing in a nullptr
here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why does this variant not take DemangleOptions
? Are they owned by NodePrinter
?
/// \param mangledNameLength The length of the mangledName string. | ||
/// \param printer The NodePrinter that will be used to demangle the symbol. | ||
void demangleSymbolAsString(const char *mangledName, size_t mangledNameLength, | ||
NodePrinter *printer); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
same here
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since this is a new API anyway... Do we access to llvm::StringRef here? Or is this meant to be compatible to a C API?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If the latter, then how would someone create a NodePrinter object? And if it's not needed, maybe we can get rid of this variant altogether?
This PR implements range tracking for the name and parameters of a demangled function.
Motivation
In this patch, @Michael137 implemented name highlighting for methods in the C++ plugin of LLDB. This results in better readability when reading backtraces of functions with long scopes.
I am working on implementing the same feature for the Swift plugin in LLDB. Please see an example below:

Before:
After:

Notice how the name and parameters of the functions are highlighted differently than the rest.
(Please note that the difference in text contents are temporary, and should disappear before for the final patch).
Implementation details
To implement this feature in the Swift plugin of LLDB, we need to provide LLDB with the ranges of the "components" of the demangled name. For instance the
baseName
ofbar.foo()
spans4...7
, while theparameters
span7...9
.This information allows LLDB to build the name that is displayed in the backtraces.
Original implementation
This patch introduces a new class called
TrackingDemanglerPrinter
which stores the information needed to track the ranges. It can later be extended to track more ranges. The methods it defines are called in theprint
method ofNodePrinter.cpp
.The previous behavior is still available when calling
DemangleSymbolAsString
without aprinter
, as this will result in a no op whenstartName
is called for instance.Current implementation
2 methods were made virtual in
NodePrinter
, so that any consumer can override them and track the ranges they need. This is less lldb specific than the previous method.Testing (removed, relevant only for the original implementation)
To implement the tests for the range tracking, I used the
manglings.txt
file. It now contains the ranges for the name and parameters where that's relevant. The format I chose to serialize the ranges is arbitrary and I'm happy to discuss any change, especially when considering we might want to add more tracked ranges.I also developed a Python script to help review the test cases by coloring them. Please find it here for reference. It could be interesting to add it to the repo.
Follow ups
swift-demangle
, as these changes make it fairly trivial to implement, and it would greatly help with readability.Please note that it was originally opened here #81511 but I moved to a different target branch.